package Q1;
/*
 使用 List 集合实现简易的学生信息管理系统，要求打印字符界面提示用户选择相应的功能，
 根据用户输入的选择去实现增加、删除、修改、查找以及遍历所有学生信息的功能。
 当新增的学号和年龄异常时，产生异常对象并抛出
 当系统退出时将 List 集合中所有学生信息写入到文件中，当系统启动时读取文件中所有学生信息到 List 集合中
**/

import java.io.*;
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        //1 创建学生信息系统，并在终端显示提示，让用户根据提示输入内容
        System.out.println("欢迎使用学生信息管理系统");
        //1.2 当系统启动时读取文件中所有学生信息到 List 集合中
        //1.2.1 创建ObjectInputStream对象与同目录的Q1_output.txt
        ObjectInputStream file = null;
        method sys = new method();
        try {
            file = new ObjectInputStream( new FileInputStream("Q1_output.txt"));
            //1.2.2 从输入流中读取一个对象并存进新启动的信息系统中
            try {
                Object obj = file.readObject();
                sys = (method) obj;
            } catch (ClassNotFoundException e) {
                e.printStackTrace();
            }
        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            //1.2.3 关闭流对象并释放有关的资源
            if(null != file){
            try {
                file.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
            }
        }
        Scanner sc = new Scanner(System.in);
        label:
        while(true){
            System.out.println("请问需要使用什么功能？");
            System.out.println("A.增加学生 B. 删除已有学生 C.修改已有学生信息 D.查找已有学生信息 E.遍历所有学生信息 F.退出系统");
            String choice = sc.nextLine().toUpperCase();
            //2 根据用户所输入内容，实现增加、删除、修改、查找以及遍历所有学生信息的功能
            switch (choice) {
                case "A": {
                    //2.1 根据用户所输入内容，实现增加
                    System.out.println("请根据提示输入想要增加的学生信息");
                    //2.1.1 根据用户所输入内容，实现学号异常抛出
                    System.out.println("请输入想要增加的学生学号");
                    String id = sc.nextLine();
                    System.out.println("请输入想要增加的学生姓名");
                    String name = sc.nextLine();
                    //2.1.2 根据用户所输入内容，实现年龄异常抛出
                    System.out.println("请输入想要增加的学生年龄");
                    while (true) {
                        int age = sc.nextInt();
                        student new_std = null;
                        try {
                                new_std = new student(id, name, age);
                            } catch (AgeException e) {
                                e.printStackTrace();
                                System.out.println("请输入正确的学生年龄");
                            }
                        if (new_std != null) {
                            try {
                                sys.addStd(new_std);
                            } catch (IDException e) {
                                e.printStackTrace();
                            }
                        }
                        break;
                    }
                    break;
                }
                //2.2 根据用户所输入内容，实现删除
                case "B": {
                    //2.2.1 根据用户所输入内容，实现学号异常抛出
                    System.out.println("请输入想要删除的学生学号");
                    String id = sc.nextLine();
                    try {
                        sys.deleteStd(id);
                    } catch (IDException e) {
                        e.printStackTrace();
                    }
                    break;
                }
                //2.3 根据用户所输入内容，实现修改
                case "C":
                    label1:
                    while (true) {
                        //2.3.1 根据用户所输入内容，实现学号异常抛出
                        System.out.println("请输入想要修改的学生学号:");
                        System.out.println("如果要退出修改功能请输入'Q'");
                        String id = sc.nextLine();
                        if (id.toLowerCase().equals("q")) {
                            break;
                        } else {
                            System.out.println("请选择想要修改的学生信息:");
                            System.out.println("A.学生ID  B.学生姓名  C.学生年龄  D.退出修改功能");
                            String choiceM = sc.nextLine().toUpperCase();
                            switch (choiceM) {

                                case "A":
                                    //2.3.2 根据用户所输入内容，实现学号异常抛出
                                    System.out.println("请选择想要修改后的学生ID:");
                                    String newID = sc.nextLine();
                                    try {
                                        sys.modifyStd(id, choiceM, newID);
                                    } catch (AgeException e) {
                                        e.printStackTrace();
                                    } catch (IDException e) {
                                        e.printStackTrace();
                                    }
                                    break;
                                case "B":
                                    System.out.println("请选择想要修改后的学生姓名:");
                                    String newName = sc.nextLine();
                                    try {
                                        sys.modifyStd(id, choiceM, newName);
                                    } catch (AgeException e) {
                                        e.printStackTrace();
                                    } catch (IDException e) {
                                        e.printStackTrace();
                                    }
                                    break;
                                case "C":
                                    //2.3.3 根据用户所输入内容，实现年龄异常抛出
                                    System.out.println("请选择想要修改后的学生年龄:");
                                    int newAge = sc.nextInt();
                                    try {
                                        sys.modifyStd(id, choiceM, newAge);
                                    } catch (AgeException e) {
                                        e.printStackTrace();
                                    } catch (IDException e) {
                                        e.printStackTrace();
                                    }
                                    break;
                                case "D":
                                    break label1;
                                default:
                                    System.out.println("请输入正确的选项");
                                    break;
                            }
                        }
                    }
                    break;
                //2.4 根据用户所输入内容，实现查找
                case "D": {
                    //2.4.1 根据用户所输入内容，实现学号异常抛出
                    System.out.println("请输入想要查找的学生学号");
                    String id = sc.nextLine();
                    try {
                        sys.searchStd(id);
                    } catch (IDException e) {
                        e.printStackTrace();
                    }
                    break;
                }
                //2.5 根据用户所输入内容，实现遍历
                case "E":
                    System.out.println("" + sys);
                    break;
                //2.6 根据用户所输入内容，实现退出系统，并将 List 集合中所有学生信息写入到文件中
                case "F":
                    //2.6.1 构造ObjectOutputStream类型的对象与本地同目录的Q1_output.txt文件关联
                    ObjectOutputStream opt = null;
                    try {
                        opt = new ObjectOutputStream(new FileOutputStream("Q1_output.txt"));
                        //2.6.2 通过流对象写入内容
                        opt.writeObject(sys);
                        System.out.println("已将所有学生信息写入到文件Q1_output.txt中");
                    } catch (IOException e) {
                        e.printStackTrace();
                    }finally {
                        if(null != opt){
                            //2.6.3 关闭流对象并释放有关的资源
                            try {
                                opt.close();
                            } catch (IOException e) {
                                e.printStackTrace();
                            }
                        }
                    }
                    break label;
                default:
                    System.out.println("请输入正确的选项");
                    break;
            }
            }

    }
    }
